package com.grupoconstruobras.sigo.integracion.personas;

import com.grupoconstruobras.sigo.data.exhumaciones.catalogue.TipoDocumentoIdentidad;
import com.grupoconstruobras.sigo.data.personas.Persona;
import com.grupoconstruobras.sigo.general.enums.CRUD;
import com.grupoconstruobras.sigo.general.util.ManagedBeanUtils;
import com.grupoconstruobras.sigo.general.util.PersonaJPADataModel;
import com.grupoconstruobras.sigo.general.util.TableBean;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.richfaces.component.SortOrder;

/**
 * @author ricardo.buitrago@globant.com
 */
@Named
@SessionScoped
public class PersonaManager extends TableBean implements Serializable {

  private static final long serialVersionUID = 6440127427801510912L;

  @Inject
  private IPersonaManager personaManager;
  //
  // @Inject
  // private Conversation conversation;

  private PersonaPopupImplementer invokerBean;

  private Persona persona;

  private String crud;

  private static final class PersonaDataModel extends PersonaJPADataModel<Persona> {
    private PersonaDataModel(EntityManager em) {
      super(em, Persona.class);
    }

    @Override
    protected Object getId(Persona t) {
      return t.getId();
    }
  }

  public static enum tableFields {
    idPersona("idPersona", "idPersona"), tipoIdentificacion("tipoIdentificacion",
        "tipoIdentificacion"), numeroIdentificacion("numeroIdentificacion", "numeroIdentificacion"), nombre(
        "nombre", "nombre");

    private String labelString;
    private String valString;

    tableFields(String label, String val) {
      labelString = label;
      valString = val;
    }

    public String toString() {
      return labelString;
    }

    public String getVal() {
      return valString;
    }

  }

  @PersistenceContext(unitName = "default")
  private EntityManager entityManager;

  @Override
  public Object getDataModel() {
    return new PersonaDataModel(entityManager);
  }

  @PostConstruct
  public void init() {
    this.crud = null;
    this.persona = new Persona();

    this.clearAll();
  }

  public void clearAll() {
    // if (conversation.isTransient()) {
    // conversation.begin();
    // }
    filterValues.clear();
    this.persona = new Persona();
    this.persona.setTipoDocumentodeidentidad(new TipoDocumentoIdentidad());
//    this.persona.setTipoIdentificacion(new TipoIdentificacion());

    sortOrders.put(tableFields.idPersona.toString(), SortOrder.unsorted);
    sortOrders.put(tableFields.tipoIdentificacion.toString(), SortOrder.unsorted);
    sortOrders.put(tableFields.numeroIdentificacion.toString(), SortOrder.unsorted);
    sortOrders.put(tableFields.nombre.toString(), SortOrder.unsorted);

  }

  public void consultarListaPersonas() {
    if (!isValidQueryFields(persona)) {
      return;
    }
    filterValues.clear();
    // log.info("{{{{{IDPERSONA}}}}}}" + persona.getIdPersona());
    // log.info("{{{{{tipoidentificacion}}}}}}" +
    // persona.getTipoIdentificacion());
    // log.info("{{{{{numeroidentificacion}}}}}}" +
    // persona.getNumeroIdentificacion());
    if (persona.getId() != null)
      filterValues.put("idPersona", persona.getId());
    if (persona.getTipoDocumentodeidentidad() != null)
      filterValues.put("tipoIdentificacion", persona.getTipoDocumentodeidentidad().getNombre());
//                                                    .getTpIdentificacionPersona());
    if (persona.getNumeroIdentificacion() != null)
      filterValues.put("numeroIdentificacion", persona.getNumeroIdentificacion());
    if (persona.getNombre() != null) {
      filterValues.put("nombre", persona.getNombre());
    }

  }

  private boolean isValidQueryFields(Persona personaParams) {
    if ((persona.getNombre() == null || persona.getNombre().trim().isEmpty())
        && persona.getTipoDocumentodeidentidad().getNombre() == null
        && (persona.getNumeroIdentificacion() == null || persona.getNumeroIdentificacion().trim()
                                                                .isEmpty())
        && persona.getId() == null) {
      FacesContext.getCurrentInstance()
                  .addMessage(null,
                              new FacesMessage(
                                               FacesMessage.SEVERITY_ERROR,
                                               ManagedBeanUtils.getMessagesBundle()
                                                               .getString("bienes.consultaBienes.minimoUnCampo"),
                                               null));
      return false;
    }
    return true;
  }

  /**
   * Método encargado de limpiar los datos del formulario y realizar
   * el set del bean que manejará los datos de la persona (Backing
   * Bean que maneja la pantalla desde la cual se llama al popUp de
   * personas)
   * 
   * @param invoker
   * @author fabio.navarrete
   */
  public void clearAndSetInvoker(PersonaPopupImplementer invoker) {
    this.clearAll();
    this.invokerBean = invoker;
  }

  public Persona getPersona() {
    return persona;
  }

  public void setPersona(Persona persona) {
    this.persona = persona;
  }

  public String getCrud() {
    return crud;
  }

  public void setCrud(String crud) {
    this.crud = crud;
  }

  public boolean isRead() {
    return this.crud != null && this.crud.equals(CRUD.READ.toString());
  }

  public void consultarPersona() {
    if (isRead()) {
      this.persona = personaManager.selectById(this.persona.getId());
    }
  }

  public void eliminarPersona() {
    // halt! are you sure? is that even legal?
  }

  public void editarPersona() {
    // TODO not implemented yet
  }

  public void onSelectPersona() {
    this.invokerBean.configurarDatosPersona(this.persona);
    clearAll();
  }
}
